package animal;

import java.util.logging.Logger;

import sim.AmeisenSimulation;
import sim.AntSimEntity;
import sim.SimulationParameters;
import ui.Grafikobjekt;

/**
 * Ein gefraessiger Kaefer.
 * 
 * @author Shkelqim Turkaj
 * @version 2009.12.31
 */

public class Spinne extends Fresstier {

	private Logger logger = Logger.getLogger(Fresstier.class.getName());
	// private static final double LAUFGESCHWINDIGKEIT = 3.7;
	// private static final String GRAFIK_SPINNE = "grafiken/spinne2.png";
	// private static final String GRAFIK_SPINNE2 = "grafiken/spinne4.png";
	// private static final String GRAFIK_KACKE = "grafiken/scheisse.png";
	private Grafikobjekt grafik;
	private SimulationParameters simParam = new SimulationParameters();

	public Spinne(String bezeichnung, double x, double y, int i) {
		super();
		setX(x);
		setY(y);
		if (i % 2 == 0) {
			setGrafik(simParam.getGrafikSpinne());
		} else {
			setGrafik(simParam.getGrafikSpinne2());
		}
		setBezeichnung(bezeichnung);
		setHungerJagdLimit(20);
		setHungerTodLimit(simParam.getMaxTodHunger() * 5);
		setBeschriftung(getBezeichnung() + " (" + "Getoetet: " + getBeute()
				+ ")");
		setMaxGeschwindigkeit(simParam.getLaufgeschwindigkeitSpinne());
		setSchrittweite(simParam.getLaufgeschwindigkeitSpinne());

	}

	/**
	 * DIe Spinne sucht nach Beute und versucht diese zu fressen. Die Spinne hat
	 * noch einen Gr��eren Hunger so das Sie kein S�ttigungsgef�hl
	 * erreicht
	 * 
	 * @ param - die Simulation
	 */
	public void jageAmeisen(AmeisenSimulation asim) {
		if (!this.getLebensZustand()) {
			return;
		}
		if (hatHunger()) {
			Ameise zielAmeise = findeNaechsteAmeise(asim.getAlleAmeisen());

			if (zielAmeise != null) {

				if (verspeisenDerAmeiseMoeglich(zielAmeise)) {

					zielAmeise.setLebendig(false);
					// new AudioPlayer("/sounds/chip.mp3").play();
					asim.getAudioSystem().playSound("sounds/chip.ogg", 1f,
							false);
					erhoeheBeute(20);

					if (getBeute() % (simParam.getAppetit() + 1) == 0) {
						setHungrig(false);
						setFressPauseBeginn(System.currentTimeMillis());
					}

				} else {

					laufeGezielt(asim, zielAmeise.getX(), zielAmeise.getY(),
							5.5, 5.5);
				}

			} else {

				laufeZufaellig(asim, 10.5, 10.5);
			}

		} else {

			if (System.currentTimeMillis() - getFressPauseBeginn() > getFressPauseDauer()) {
				setHungrig(true);
			}

			laufeZufaellig(asim, 10.5, 10.5);
		}
	}

	/**
	 * DIe Spinne sucht nach Beute und versucht diese zu fressen. Die Spinne hat
	 * noch einen Gr��eren Hunger so das Sie kein S�ttigungsgef�hl
	 * erreicht
	 * 
	 * @ param - die Simulation
	 */
	public void jageKaefer(AmeisenSimulation asim) {

		if (hatHunger()) {

			Fresstier zielKaefer = findeNaechsteKaefer(asim.getAlleKaefer());

			if (zielKaefer != null) {

				if (verspeisenDesKaefersMoeglich((Kaefer) zielKaefer)) {
					// new AudioPlayer("/sounds/splash.mp3").play();
					asim.getAudioSystem().playSound("sounds/splash.ogg", 1f,
							false);
					zielKaefer.setLebendig(false, 0);
					zielKaefer.setBeschriftung("Gefressen");

					erhoeheBeute(60);

					if (getBeute() % (simParam.getAppetit() + 1) == 0) {
						setHungrig(false);
						setFressPauseBeginn(System.currentTimeMillis());
					}

				} else {

					laufeGezielt(asim, zielKaefer.getX(), zielKaefer.getY(),
							5.5, 5.5);
				}

			} else {

				laufeZufaellig(asim, 10.5, 10.5);
			}

		} else {

			if (System.currentTimeMillis() - getFressPauseBeginn() > getFressPauseDauer()) {
				setHungrig(true);
			}

			laufeZufaellig(asim, 10.5, 10.5);
		}

		// haeufchen?
		if (mussHaeufchenMachen()) {
			grafik = new Grafikobjekt();
			grafik.setGrafik(simParam.getGrafikKacke());
			grafik.setX(getX());
			grafik.setY(getY());
			logger.severe("hauefchen");
			// asim.getAnzeigefeld().setzteTempGrafikobjekt(grafik, 12000);
			haeufchenGemacht();
		}
	}

	public boolean verspeisenMoeglich(Lauftier a) {
		return (hatHunger() && istNahe(a.getX(), a.getY(),
				simParam.getBeuteFressRadius()));
	}

	@Override
	public void jage(AmeisenSimulation asim, AntSimEntity beute) {
		if (hatHunger() && beute != null) {
			Lauftier beuteObj = (Lauftier) beute.getRef();
			if (verspeisenMoeglich(beuteObj)) {
				beuteObj.setLebendig(false);
				// new AudioPlayer("/sounds/chip.mp3").play();
				asim.getAudioSystem().playSound("sounds/chip.ogg", 1f, false);
				erhoeheBeute(beuteObj instanceof Ameise ? 10 : 50);
			} else {
				laufeGezielt(asim, beuteObj.getX(), beuteObj.getY(), 5.5, 5.5);
			}

		} else {

			if (System.currentTimeMillis() - getFressPauseBeginn() > getFressPauseDauer()) {
				setHungrig(true);
			}

			laufeZufaellig(asim, 10.5, 10.5);
		}
	}

	@Override
	public void setLebendig(boolean lebendig, int killType) {
		super.setLebendig(lebendig);
		switch (killType) {
		case 0:
			setGrafik(simParam.getGrafikGetoeteteSpinne());
			break;
		case 1:
			setGrafik(simParam.getGrafikGetoeteteSpinne());
		}
	}
}
